UnityのPath.Combineの挙動で殺意駆動しよう


概要

UnityのPath.Combine関数の挙動がムカつく感じだったので纏めておく。

MacとWindowsで挙動が異なり、というかWindows版だけおもしろおかしい。


以下はすべてWindows版での挙動。



Path.Combine(string a, string b)

a,b2つのstrに対して、a/b のようにパスっぽく繋いで返す。


のだけど、例外的な動作が複数含まれている。



aの終わりが/である場合

var c = Path.Combine(“A/”, “B”);

cには A/B が入る。



aの終わりが/でない場合

var c = Path.Combine(“A”, “B”);

cには A\B が入る。エーバックスラッシュビィーだ。


で、当然のようにUnity内では、

Application.dataPath とかが


C:/somewhere/PROJECT_FOLDER/Assets


とか平然と/で区切ったパスを返してくるので、

ここでAssets下のパスとくっつけようとすると、


var c = Path.Combine(Application.dataPath, “folder/contents”);

c -> C:/somewhere/PROJECT_FOLDER/Assets\folder/contents


とかになる。\が混じる。苦痛だ。地獄か。

第一引数には/で終わるstrをいれないと、Mac/Win両方で動くコードにはならない。おま、、



例えばパスからファイルを読み込んだりする関数があると、こける。



Path.Combine以外にも\が混じるコードがあるようで、Mac/Winでそれらを大量に扱う場合、中間オブジェクトみたいなの用意して

Pathを扱った方が良い気がする。


間違っても/とか\を妄信的にpath delimiterとして使うと詰む。



bの始まりが/である場合

var c = Path.Combine(“A”, “/B”)

こいつは、/Bになる。A? 知らない子ですね、、、

C♯でのPath.Combine(str a, str b)の仕様もこうなので、「ヘェ~ふしぎだけどこういうものなんだな」以外の感想は無い。

きみらフツーはC:とかドライブ指定あるんちゃうんか。



以上から

第一引数の末尾が/か、 また、第二引数の頭が/ではないかどうか、調べて使うと事故が減る。

気に入らん。